package dancereal;



public class J18_00P4 {
	/* static
	 * 일반적으로 객체를 생성하려면
	 * 생성자를 사용해야 함
	 * 하지만, 생성자 없이 객체를 
	 * 바로 사용할 수도 있음
	 * static 예약어를 멤버변수나
	 * 메서드에 사용하면 객체 생성없이
	 * 바로 클래스를 사용할 수 있음
	 * static 으로 선언된 클래스는
	 * 클래스명.멤버변수 형태로 사용
	 * static 으로 선언된 메서드는
	 * 클래스명.메서드 형태로 사용
	 * static 으로 선언된 멤버 변수를
	 * 클래스(공용) 변수 라고 부르기도 함
	 * 이것과 유사하게 C에서는 전역변수라고 함
	 * 
	 * static 으로 선언된 멤버변수는 main() 메서드가
	 * 호출되기 전에 미리 메모리에 변수공간이 생성됨 
	 * 반면에 객체는 main() 메서드가 호출되고 
	 * 해당 클래스의 생성자가 호출되어야만 변수공간이 생성
	 */
	
	/* OOP 작성기법1
	 * 프로그램 작성시 클래스는 용도(값,처리)에 따라
	 * 최소 2개이상으로 나눠 작성하는 것을 추천
	 * 값만을 저장하는 클래스 : value object 클래스
	 * 값을 받아서 처리만 하는 클래스 : service 클래스
	 */
	
	// 인수 전달 방식
		
	public static void main(String[] args) {
		Rent r20131107001 = new Rent();
		r20131107001.bookno = 8746; // 대여한 대상 번호
		r20131107001.memberno = 68; // 대여한 사람 번호
		
		r20131107001.showRentInfo(); // 대여 정보 출력
		System.out.println("\n");
		
	// static 으로 선언된 클래스 사용
		StaticRent.rentno = 12345678;
		StaticRent.bookno = 415144;
		StaticRent.memberno = 4134;
		StaticRent.showRentInfo();

	// 성적데이터 초기화
	    SungJuk sj = new SungJuk();
	    sj.kor = 32;
	    sj.eng = 45;
	    sj.mat = 55;
	    //sj.tot = sj.kor + sj.eng + sj.mat;
	    sj.tot = sj.showTotal();
	    
	// 성적데이터 초기화2
	    SungJukVO sjvo = new SungJukVO(99,98,99);
	    SungJukService s = new SungJukService();
	    sjvo.tot = s.getTotal(sjvo.kor,sjvo.eng,sjvo.mat);
	    
	// 생성자를 쓰지 않고 메서드 호출
	    System.out.println("\n");
	    sjvo.tot = SungJukService.getTotal2(sjvo.kor, sjvo.eng, sjvo.mat);
	    System.out.println(sjvo.tot);
	}

}

class Rent{ // 대여
	int rentno;
	int bookno;
	int memberno;
	
	// 대여정보 출력 showRentInfo
	
	
	void showRentInfo(){
	System.out.println(rentno);
	System.out.println(bookno);
	System.out.println(memberno);	
	
	}
}

class StaticRent{ // 객체 생성 없이 클래스 사용
	static int rentno;
	static int bookno;
	static int memberno;
	String rentdate; // static 으로 선언되지 않았음
	
	// 대여정보 출력 showRentInfo
	static void showRentInfo(){
	System.out.println(rentno);
	System.out.println(bookno);
	System.out.println(memberno);	
	// System.out.println(rentdate);	// 오류 발생!
	// static 메서드에서는 비 static 변수는 사용불가
	// 하지만, rentdate 를 사용하고 싶다면 ?
	StaticRent sr = new StaticRent();
	System.out.println(sr.rentdate);
	}
}

class SungJuk{
	int kor;
	int eng;
	int mat;
	int tot;
	
	public SungJuk(){}
	public SungJuk(int kor, int eng, int mat){
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
		
	}
		int showTotal(){ return kor + eng + mat;}
		
}

// 성적 클래스 : 성적에 관련된 데이터만 저장
// 즉, 멤버변수만 존재하고 그것을 처리하는 
// 메서드는 없음 - 값만 저장하는 클래스
class SungJukVO {
	String name;
	int kor;
	int eng;
	int mat;
	int tot;

	// 생성자
 public SungJukVO(){}
 public SungJukVO(int kor, int eng, int mat){
	 this.kor = kor;
	 this.eng = eng;
	 this.mat = mat;
 }
}
// 성적 데이터에 대한 총점,평균,학점등을 
// 처리하는 클래스
class SungJukService{
	int getTotal(int kor, int eng, int mat){
		return kor + eng + mat;
	}
	static int getTotal2(int kor, int eng, int mat){
		return kor + eng + mat;
	}
}


